/**
 * 给你一个按 非递减顺序 排序的整数数组 nums，返回 每个数字的平方 组成的新数组，要求也按非递减顺序排序。
   示例 1：输入：nums = [-4,-1,0,3,10] 输出：[0,1,9,16,100]; 
   解释：平方后，数组变为 [16,1,0,9,100]，排序后，数组变为 [0,1,9,16,100];
   示例 2：输入：nums = [-7,-3,2,3,11] 输出：[4,9,9,49,121].
 */

//解法一:暴力解法(平方后直接排序)
const nums = [-5, -3, -1, 0, 2, 4, 6];
function force(nums) {
  for (let i = 0; i < nums.length; i++) {
    nums[i] *= nums[i]
  }
  nums.sort((a, b) => a - b);
  return nums;
}
console.log(force(nums));

//解法二:双指针法
/**
 *  双指针法，i指向起始位置，j指向终止位置。
    定义一个新数组result，和A数组一样的大小，让k指向result数组终止位置。
    如果A[i] * A[i] < A[j] * A[j] 那么result[k--] = A[j] * A[j]; 。
    如果A[i] * A[i] >= A[j] * A[j] 那么result[k--] = A[i] * A[i];
 */
const nums2 = [-5, -2, -1, 0, 2, 4, 7];
function sortedSquares(nums) {
  let len = nums.length;
  let res = new Array(len).fill(0);
  // i指向起始位置,j指向最终位置,k也指向最终位置并收集结果集.
  let i = 0, j = len - 1, k = len - 1;
  while (i <= j) {
    let left = nums[i] * nums[i];
    let right = nums[j] * nums[j];
    if (left < right) {
      res[k--] = right;
      j--;
    } else {
      res[k--] = left;
      i++;
    }
  }
  return res;
}
console.log(sortedSquares(nums2));